/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is Forte for Java, Community Edition. The Initial
* Developer of the Original Code is Sun Microsystems, Inc. Portions
* Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.form.palette;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.jar.*;
import java.beans.PropertyVetoException;
import java.text.MessageFormat;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import org.openide.*;
import org.openide.nodes.Node;
import org.openide.cookies.InstanceCookie;
import org.openide.filesystems.*;
import org.openide.loaders.*;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
import org.netbeans.modules.form.FormLoaderSettings;
import org.netbeans.modules.clazz.ClassDataObject;
/** Bean Installer
*
* @author Petr Hamernik
*/
public final class BeanInstaller extends Object {
/** Text resources */
static final ResourceBundle bundle = NbBundle.getBundle(BeanInstaller.class);
/** Last opened directory */
private static File lastDirectory;
/** Borders used in dialogs */
static final Border hasFocusBorder;
static final Border noFocusBorder;
/** Initialize static fields */
static {
hasFocusBorder = new LineBorder(UIManager.getColor("List.focusCellHighlight")); // NOI18N
noFocusBorder = new EmptyBorder(1, 1, 1, 1);
lastDirectory = null;
}
/** Extension of jar archive where to find module */
static String JAR_EXT = ".jar"; // NOI18N
//==============================================================================
// Installing new beans - user action.
//==============================================================================
/** Open the FileOpenDialog for the selection of Jar file and
* install the selected module into the system.
*/
public static void installBean() {
File jarFile = selectJarModule();
if (jarFile != null) {
JarFileSystem jar = createJarForFile(jarFile);
if (jar == null) {
TopManager.getDefault().notify(new NotifyDescriptor.Message(
bundle.getString("MSG_ErrorInFile"), NotifyDescriptor.ERROR_MESSAGE)
);
}
else {
LinkedList list = findJavaBeans(jar);
if (list.size() == 0) {
TopManager.getDefault().notify(new NotifyDescriptor.Message(
bundle.getString("MSG_noBeansInJar"), NotifyDescriptor.INFORMATION_MESSAGE)
);
return;
}
BeanSelector sel = new BeanSelector(list);
DialogDescriptor desc = new DialogDescriptor (
sel,
bundle.getString("CTL_SelectJB"),
true,
null
);
desc.setHelpCtx (new HelpCtx (BeanInstaller.class.getName () + ".installBean")); // NOI18N
TopManager.getDefault ().createDialog (desc).show ();
if (desc.getValue () == NotifyDescriptor.OK_OPTION) {
String pal = selectPaletteCategory();
if (pal != null) {
finishInstall(jar, sel.getSelectedBeans(), pal);
}
}
}
}
}
/** Open the palette category selector and if user confirms some category, installs specified beans into it.
*/
/*
public static void installBeans(InstanceCookie[] cookies) {
String pal = selectPaletteCategory();
if (pal == null) return; // installation cancelled
ArrayList list = new ArrayList (cookies.length);
for (int i = 0; i < cookies.length; i++) {
list.add (cookies[i]);
}
if (pal != null) {
finishInstall(null, list, pal);
}
}
*/
public static void installBeans(Node[] nodes) {
String pal = selectPaletteCategory();
if (pal == null)
return;
ArrayList list = new ArrayList (nodes.length);
for (int i = 0; i < nodes.length; i++) {
DataObject dobj = (DataObject) nodes[i].getCookie(ClassDataObject.class);
if (dobj != null)
list.add(dobj);
else {
InstanceCookie ic = (InstanceCookie) nodes[i].getCookie(InstanceCookie.class);
if (ic != null)
list.add(ic);
}
}
finishInstall(null, list, pal);
}
/** Scan all files with attributes in the given jar.
* @return LinkedList of founded beans.
*/
private static LinkedList findJavaBeans(JarFileSystem jar) {
LinkedList foundJB = new LinkedList();
// Looking for the beans
Manifest manifest = jar.getManifest();
Map entries = manifest.getEntries();
Iterator it = entries.keySet().iterator();
while (it.hasNext()) {
String key = (String) it.next();
String value = ((Attributes) entries.get(key)).getValue("Java-Bean"); // NOI18N
//System.out.println ("Key: >"+key+"<"); // NOI18N
//System.out.println ("Value: >"+value+"<"); // NOI18N
if ((value != null) && value.equalsIgnoreCase("True")) { // NOI18N
if (key.endsWith(".class")) { // NOI18N
String wholeName = key.substring(0, key.length() - 6).replace('/', '.').replace('\\', '.');
int lastDot = wholeName.lastIndexOf('.');
String pack;
String name;
if (lastDot == -1) {
pack = ""; // NOI18N
name = wholeName;
}
else {
pack = wholeName.substring(0, lastDot);
name = wholeName.substring(lastDot + 1);
}
FileObject fo = jar.find(pack, name, "class"); // NOI18N
if (fo != null) {
foundJB.add(fo);
}
} else if (key.endsWith(".ser")) { // NOI18N
String wholeName = key.substring(0, key.length() - 4).replace('/', '.').replace('\\', '.');
int lastDot = wholeName.lastIndexOf('.');
String pack;
String name;
if (lastDot == -1) {
pack = ""; // NOI18N
name = wholeName;
}
else {
pack = wholeName.substring(0, lastDot);
name = wholeName.substring(lastDot + 1);
}
FileObject fo = jar.find(pack, name, "ser"); // NOI18N
//System.out.println ("Find fo: >"+fo+"<"+ ", : "+pack+", "+name); // NOI18N
if (fo != null) {
foundJB.add(fo);
}
}
}
}
return foundJB;
}
/** Finishing the instalation of the java beans.
* @param jar JarFileSystem - the source of JBs to be mounted, or null if not necessary
* @param list Collection of FileObjects - selected JBs
* @param pal palettecategory where to place beans.
*/
private static void finishInstall(JarFileSystem jar, final Collection list, String pal) {
if (jar != null) addJarFileSystem (jar);
if (pal == null) {
pal = "Beans"; // default palette category // NOI18N
}
FileObject root = TopManager.getDefault().getRepository().getDefaultFileSystem().getRoot();
FileObject paletteFolder = root.getFileObject ("Palette"); // NOI18N
if (paletteFolder == null) {
return;
}
FileObject category = paletteFolder.getFileObject(pal);
if (category == null) {
try {
category = paletteFolder.createFolder (pal);
} catch (IOException e) {
if (System.getProperty ("netbeans.debug.exceptions") != null) e.printStackTrace ();
/* ignore */
return;
}
}
ClassLoader loader = TopManager.getDefault().currentClassLoader();
Iterator it = list.iterator();
LinkedList paletteNodes = new LinkedList();
while (it.hasNext()) {
Object obj = it.next();
String name = null;
if (obj instanceof FileObject) {
if ("class".equals (((FileObject)obj).getExt ())) { // NOI18N
name = ((FileObject)obj).getPackageName('.');
if (name != null) createInstance(category, name, null);
} else {
createShadow (category, (FileObject)obj);
}
} else if (obj instanceof InstanceCookie) {
name = ((InstanceCookie)obj).instanceName ();
if (name != null) createInstance(category, name, null);
} else if (obj instanceof ClassDataObject) {
try {
((ClassDataObject)obj).createShadow(DataFolder.findFolder(category));
} catch (IOException ex) {
TopManager.getDefault ().notifyException(ex);
}
}
}
}
private static void addJarFileSystem (JarFileSystem jar) {
// 1. store information about the JAR/ZIP into $NETBEANS_USER/beans/libs.properties
// so that it will be added to every new project's filesystems
File localFolder = new File(System.getProperty("netbeans.user") + File.separator + "beans");
if (!localFolder.exists ()) {
localFolder.mkdirs ();
}
File installedLibsFile = new File(System.getProperty("netbeans.user") + File.separator + "beans" + File.separator + "libs.properties");
Properties installedLibs = new Properties ();
try {
installedLibs.load (new FileInputStream (installedLibsFile));
} catch (IOException e) {
if (System.getProperty ("netbeans.debug.exceptions") != null) e.printStackTrace ();
/* ignore */
}
HashMap libsMap = new HashMap (installedLibs.size ()*2);
String newName;
try {
for (Enumeration e = installedLibs.propertyNames (); e.hasMoreElements ();) {
String lib = installedLibs.getProperty ((String)e.nextElement ());
libsMap.put (lib, lib);
}
newName = jar.getJarFile ().getCanonicalPath ();
if (libsMap.get (newName) == null) {
libsMap.put (newName, newName);
installedLibs.clear ();
int index = 1;
for (Iterator it = libsMap.keySet ().iterator (); it.hasNext (); ) {
installedLibs.setProperty ("library"+index, (String)it.next ());
index++;
}
installedLibs.store (new FileOutputStream (installedLibsFile), "");
}
} catch (IOException e) {
if (System.getProperty ("netbeans.debug.exceptions") != null) e.printStackTrace ();
/* ignore */
}
// 2. add it to the current project's filesystems
boolean alreadyInstalled = false;
if (jar != null) {
Repository rep = TopManager.getDefault().getRepository();
JarFileSystem jar2 = (JarFileSystem) rep.findFileSystem(jar.getSystemName());
if (jar2 != null) {
alreadyInstalled = true;
jar = jar2;
}
if (!alreadyInstalled) {
jar.setHidden(true);
rep.addFileSystem(jar);
}
}
}
private static void createShadow (FileObject folder, FileObject original) {
try {
DataObject originalDO = DataObject.find (original);
// System.out.println ("createShadow: "+folder + ", : " + original +", : "+originalDO); // NOI18N
if (originalDO != null) {
DataShadow.create (DataFolder.findFolder (folder), originalDO);
}
} catch (IOException e) {
TopManager.getDefault ().notifyException (e);
}
}
private static void createInstance(FileObject folder, String className, String iconName) {
String fileName = formatName(className);
FileLock lock = null;
try {
if (folder.getFileObject(fileName+".instance") == null) { // NOI18N
FileObject fo = folder.createData(fileName, "instance"); // NOI18N
if (iconName != null) {
lock = fo.lock ();
java.io.OutputStream os = fo.getOutputStream (lock);
String ic = "icon="+iconName; // NOI18N
os.write (ic.getBytes ());
}
DataObject dobj = DataObject.find (fo);
if (dobj != null) {
// enforce creation of node so that it is displayed
dobj.getNodeDelegate ();
}
}
} catch (java.io.IOException e) {
if (System.getProperty ("netbeans.debug.exceptions") != null) e.printStackTrace ();
/* ignore */
} catch (Throwable t) {
if (t instanceof ThreadDeath) {
throw (ThreadDeath)t;
} else {
t.printStackTrace ();
}
} finally {
if (lock != null) {
lock.releaseLock ();
}
}
}
private static String formatName (String className) {
String ret = className.substring(className.lastIndexOf (".") + 1) + "[" + className.replace ('.', '-') + "]"; // NOI18N
return ret;
}
/** Opens dialog and lets user select category, where beans should be installed
*/
private static String selectPaletteCategory() {
PaletteSelector sel = new PaletteSelector();
DialogDescriptor desc = new DialogDescriptor (
sel,
bundle.getString("CTL_SelectPalette"),
true,
null
);
desc.setHelpCtx (new HelpCtx (BeanInstaller.class.getName () + ".selectPaletteCategory")); // NOI18N
TopManager.getDefault ().createDialog (desc).show ();
if (desc.getValue () == NotifyDescriptor.OK_OPTION) {
return sel.getSelectedCategory();
} else {
return null;
}
}
/** This method open FileChooser and selects
* the jar file with the module.
*
* @return filename or null if operation was cancelled.
*/
private static File selectJarModule() {
JFileChooser chooser = new JFileChooser();
chooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
public boolean accept(File f) {
return (f.isDirectory() || f.getName().endsWith(JAR_EXT));
}
public String getDescription() {
return bundle.getString ("CTL_JarArchivesMask");
}
});
if (lastDirectory != null) {
chooser.setCurrentDirectory(lastDirectory);
}
chooser.setDialogTitle(bundle.getString("CTL_SelectJar"));
if (chooser.showDialog(TopManager.getDefault ().getWindowManager ().getMainWindow (),
bundle.getString("CTL_Select_Approve_Button"))
== JFileChooser.APPROVE_OPTION)
{
File f = chooser.getSelectedFile();
lastDirectory = chooser.getCurrentDirectory();
if ((f != null) && f.isFile()) {
if (f.getName ().endsWith(JAR_EXT)) {
return f;
} else {
TopManager.getDefault().notify(new NotifyDescriptor.Message(
bundle.getString("MSG_noBeansInJar"), NotifyDescriptor.INFORMATION_MESSAGE)
);
}
}
}
return null;
}
/**
* @return jar FS for the given name or null if some problems occured
*/
private static JarFileSystem createJarForFile(File jarFile) {
try {
JarFileSystem jar = new JarFileSystem();
jar.setJarFile(jarFile);
return jar;
}
catch (PropertyVetoException e) {
if (System.getProperty ("netbeans.debug.exceptions") != null) e.printStackTrace ();
return null;
}
catch (IOException e) {
if (System.getProperty ("netbeans.debug.exceptions") != null) e.printStackTrace ();
/* ignore */
return null;
}
}
//==============================================================================
// Auto loading beans on startup
//==============================================================================
/** Auto loading all jars - beans */
public static void autoLoadBeans() {
FormLoaderSettings settings = new FormLoaderSettings();
File globalFolder = new File(System.getProperty("netbeans.home") + File.separator + "beans");
try {
globalFolder = new File(globalFolder.getCanonicalPath());
} catch (IOException e) {
if (System.getProperty ("netbeans.debug.exceptions") != null) e.printStackTrace ();
/* ignore */
}
File localFolder = new File(System.getProperty("netbeans.user") + File.separator + "beans");
try {
localFolder = new File(localFolder.getCanonicalPath());
} catch (IOException e) {
if (System.getProperty ("netbeans.debug.exceptions") != null) e.printStackTrace ();
/* ignore */
}
if (autoLoadFolders(globalFolder, localFolder)) {
/* JST: Why? A hack?
java.awt.EventQueue.invokeLater (
new Runnable () {
public void run () {
ComponentPalette.getDefault ().updatePalette ();
}
}
);
*/
}
}
/** Loads the beans stored in the given folder.
* @param folder - where to find jars
*/
private static boolean autoLoadFolders(File globalFolder, File localFolder) {
if (!(globalFolder.exists() || localFolder.exists()))
return false;
boolean modified = false;
final String localBase = localFolder.getAbsolutePath() + File.separator;
String globalBase = null; if (globalFolder != localFolder) globalBase = globalFolder.getAbsolutePath() + File.separator;
File[] list = localFolder.listFiles ();
if (list == null) list = new File[0];
if (globalBase != null) {
File[] globalList = globalFolder.listFiles ();
if (globalList == null) globalList = new File[0];
if (globalList.length > 0) {
// add the list of jars in the global folder as well
File[] newList = new File[list.length + globalList.length];
System.arraycopy (list, 0, newList, 0, list.length);
System.arraycopy (globalList, 0, newList, list.length, globalList.length);
list = newList;
}
}
// 1. load list of already installed beans
FileInputStream fis2 = null;
Properties alreadyInstalled = new Properties();
try {
alreadyInstalled.load(fis2 = new FileInputStream(localBase + "installed.properties")); // NOI18N
} catch (IOException e) {
/* ignore - the file just does not exist */
} finally {
if (fis2 != null) try { fis2.close (); } catch (IOException e) { /* ignore */ };
}
// 2. process local beans
Properties details = new Properties();
FileInputStream fis = null;
try {
details.load(fis = new FileInputStream(localBase + "beans.properties")); // NOI18N
} catch (IOException e) {
if (System.getProperty ("netbeans.debug.exceptions") != null)
System.err.println(e.getMessage());
// ignore in this case
} finally {
if (fis != null) try { fis.close (); } catch (IOException e) { /* ignore */ };
}
// 3. process global beans
if (globalBase != null) {
FileInputStream fis3 = null;
try {
Properties globalDetails = new Properties ();
globalDetails.load(fis3 = new FileInputStream(globalBase + "beans.properties")); // NOI18N
for (Enumeration e = globalDetails.propertyNames (); e.hasMoreElements (); ) {
String propName = (String)e.nextElement ();
if (details.get (propName) == null) { // if not present in the local list, copy the <name, value> to it
details.put (propName, globalDetails.get (propName));
}
}
} catch (IOException e) {
if (System.getProperty ("netbeans.debug.exceptions") != null) e.printStackTrace ();
// ignore in this case
} finally {
if (fis3 != null) try { fis3.close (); } catch (IOException e) { /* ignore */ };
}
}
String[] categories = ComponentPalette.getDefault ().getPaletteCategories();
for (int i = 0; i < list.length; i++) {
if (list[i].getName ().endsWith(JAR_EXT)) {
if (alreadyInstalled.get(list[i].getName ()) == null) {
modified = true;
String withoutExt = list[i].getName ().substring(0, list[i].getName ().length() - JAR_EXT.length());
String categoryName = details.getProperty(withoutExt, withoutExt);
if (autoLoadJar(list[i], categoryName, details.getProperty(withoutExt + ".beans"))) {
alreadyInstalled.put(list[i].getName (), "true"); // NOI18N
}
} else {
// ensure, that the filesystems are present
addJarFileSystem (createJarForFile(list[i]));
}
}
}
if (modified) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(localBase + "installed.properties"); // NOI18N
alreadyInstalled.store(fos, org.netbeans.modules.form.FormEditor.getFormBundle().getString ("MSG_InstalledArchives"));
} catch (IOException e) {
if (System.getProperty ("netbeans.debug.exceptions") != null) e.printStackTrace ();
// ignore
} finally {
if (fos != null) try { fos.close (); } catch (IOException e) { /* ignore */ };
}
}
return modified;
}
/** Loaded beans from the jar.
* @param jarFile the jar File
* @param palette category where to place the beans
* @param selection the selection of beans which should be installed. If null, all beans are loaded.
*/
private static boolean autoLoadJar(File jarFile, String paletteCategory, String selection) {
JarFileSystem jar = createJarForFile(jarFile);
if (jar == null) {
TopManager.getDefault().notify(
new NotifyDescriptor.Message(bundle.getString("MSG_ErrorInFile"),
NotifyDescriptor.ERROR_MESSAGE)
);
return false;
}
else {
JarFileSystem jar2 = (JarFileSystem) TopManager.getDefault ().getRepository ().findFileSystem (jar.getSystemName());
if (jar2 != null)
jar = jar2;
LinkedList list = findJavaBeans(jar);
if (selection != null) {
Vector dest = new Vector();
StringTokenizer tok = new StringTokenizer(selection, ", ", false); // NOI18N
while (tok.hasMoreTokens()) {
String token = tok.nextToken();
String clName = token;
String clPack = ""; // NOI18N
int lastDot = token.lastIndexOf('.');
if ((lastDot != -1) && (!token.endsWith("."))) { // NOI18N
clName = token.substring(lastDot + 1);
clPack = token.substring(0, lastDot);
}
FileObject fo = jar.find(clPack, clName, "class"); // NOI18N
if (fo == null) { // if not found, try ser
fo = jar.find(clPack, clName, "ser"); // NOI18N
}
if (fo != null) {
Iterator it = list.iterator ();
while (it.hasNext()) {
FileObject fo2 = (FileObject) it.next();
if (fo.equals(fo2)) {
dest.addElement(fo);
}
}
}
}
finishInstall(jar, dest, paletteCategory);
} else {
finishInstall(jar, list, paletteCategory);
}
return true;
}
}
//==============================================================================
// Inner classes
//==============================================================================
static class PaletteSelector extends JPanel {
private JList list;
static final long serialVersionUID =936459317386043582L;
/** Creates a new ExceptionBox for given exception descriptor. */
public PaletteSelector() {
super(null);
String[] categories = ComponentPalette.getDefault ().getPaletteCategories();
list = new JList(categories);
list.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
/* list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent evt) {
okButton.setEnabled(!list.isSelectionEmpty());
}
});
*/
/* list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
closeDlg(true);
}
}
});
[PENDING - doubleclick]
*/
BorderLayout layout = new BorderLayout();
layout.setVgap(5);
layout.setHgap(5);
setLayout(layout);
add(new JLabel(bundle.getString("CTL_PaletteCategories")), "North");
add(new JScrollPane (list), "Center"); // NOI18N
setBorder(new EmptyBorder(5, 5, 5, 5));
}
public String getSelectedCategory() {
return (String) list.getSelectedValue ();
}
public Dimension getPreferredSize() {
Dimension ret = super.getPreferredSize();
ret.width = Math.max(ret.width, 350);
ret.height = Math.max(ret.height, 250);
return ret;
}
}
/** dialog which allows to select found beans */
public static class BeanSelector extends JPanel {
private JList list;
static final long serialVersionUID =-6038414545631774041L;
/** Creates a new ExceptionBox for given exception descriptor. */
public BeanSelector(LinkedList fileObjects) {
super(null);
Object[] arr = new Object[fileObjects.size ()];
fileObjects.toArray (arr);
list = new JList(arr);
list.setCellRenderer(new FileObjectRenderer());
/* list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
closeDlg(true);
}
}
});
[PENDING - doubleclick]
*/
// [PENDING - OK/Cancel enabled accorning to selection
BorderLayout layout = new BorderLayout();
layout.setVgap(5);
layout.setHgap(5);
setLayout(layout);
add(new JLabel(bundle.getString("CTL_SelectBeans")), "North");
add(new JScrollPane (list), "Center"); // NOI18N
setBorder(new EmptyBorder(5, 5, 5, 5));
}
Collection getSelectedBeans() {
Object[] sel = list.getSelectedValues ();
ArrayList al = new ArrayList (sel.length);
for (int i = 0; i < sel.length; i++) {
al.add (sel[i]);
}
return al;
}
public Dimension getPreferredSize() {
Dimension ret = super.getPreferredSize();
ret.width = Math.max(ret.width, 350);
ret.height = Math.max(ret.height, 250);
return ret;
}
}
static class FileObjectRenderer extends JLabel implements ListCellRenderer {
static final long serialVersionUID =832555965217675765L;
/** Creates a new NetbeansListCellRenderer */
public FileObjectRenderer() {
setOpaque(true);
setBorder(noFocusBorder);
}
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
if (!(value instanceof FileObject))
return this;
FileObject fo = (FileObject) value;
setText(fo.getName());
if (isSelected){
setBackground(UIManager.getColor("List.selectionBackground")); // NOI18N
setForeground(UIManager.getColor("List.selectionForeground")); // NOI18N
}
else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
setBorder(cellHasFocus ? hasFocusBorder : noFocusBorder);
return this;
}
}
}
/*
* Log
* 34 Gandalf 1.33 3/7/00 Tran Duc Trung fix #5791: cannot add
* serialized bean to component palette
* 33 Gandalf 1.32 1/19/00 Pavel Buzek
* 32 Gandalf 1.31 1/17/00 Jesse Glick Localized filenames.
* 31 Gandalf 1.30 1/16/00 Ian Formanek Different format in
* properties files.
* 30 Gandalf 1.29 1/15/00 Pavel Buzek
* 29 Gandalf 1.28 1/15/00 Ian Formanek Creates
* beans/libs.properties
* 28 Gandalf 1.27 1/13/00 Ian Formanek NOI18N #2
* 27 Gandalf 1.26 1/12/00 Pavel Buzek I18N
* 26 Gandalf 1.25 1/5/00 Ian Formanek NOI18N
* 25 Gandalf 1.24 11/5/99 Jaroslav Tulach ComponentPalette.getDefault
* is back.
* 24 Gandalf 1.23 11/4/99 Jaroslav Tulach Component palette is
* faster/better/etc.
* 23 Gandalf 1.22 10/23/99 Ian Formanek NO SEMANTIC CHANGE - Sun
* Microsystems Copyright in File Comment
* 22 Gandalf 1.21 10/12/99 Ian Formanek Fixed multi-user
* configuration with no "beans" folder in the shared installation.
* 21 Gandalf 1.20 10/12/99 Ian Formanek Fixed problem with
* NullPointerException thrown under some conditions...
* 20 Gandalf 1.19 10/10/99 Ian Formanek Correctly works in
* multi-user installation
* 19 Gandalf 1.18 10/5/99 Jaroslav Tulach Change in DataShadow.
* 18 Gandalf 1.17 9/26/99 Ian Formanek Fixed bug 4018 - If a
* JAR archive is added to the beans folder, the beans are not
* automatically installed on IDE startup if they are not explicitly
* mentioned in the beans.properties file. and bug 1906 - Bean Installer
* should better notify if selected file does not contain any beans.
* 17 Gandalf 1.16 9/23/99 Ian Formanek Better notification in
* case that the JAR Archive does not contain any JavaBeans.
* 16 Gandalf 1.15 9/9/99 Ian Formanek Exceptions notification
* 15 Gandalf 1.14 8/10/99 Ian Formanek Generated Serial Version
* UID
* 14 Gandalf 1.13 8/9/99 Ian Formanek Fixed bug which cused
* newly installed beans not to be visible in the palette
* 13 Gandalf 1.12 7/25/99 Ian Formanek Fixed bug 2582 - Beans
* tab is empty although the COmponent Palette node shows that there is
* the Timer bean
* 12 Gandalf 1.11 7/18/99 Ian Formanek InstallToPaletteAction
* 11 Gandalf 1.10 7/8/99 Jesse Glick Context help.
* 10 Gandalf 1.9 6/22/99 Ian Formanek Fixed bug 2004 - The
* dialog for selecting JavaBean isn't dialog commonly used in IDE but
* classical MS Windows filedialog. Also after installing bean IDE must be
* restarted.
* 9 Gandalf 1.8 6/10/99 Ian Formanek loadedBeans ->
* properties rather than FormSettings
* 8 Gandalf 1.7 6/9/99 Ian Formanek ---- Package Change To
* org.openide ----
* 7 Gandalf 1.6 6/7/99 Ian Formanek
* 6 Gandalf 1.5 6/7/99 Ian Formanek Fixed problem with
* beans.properties not containing item for JAR archive
* 5 Gandalf 1.4 6/7/99 Ian Formanek PaletteCategory is
* created if it does not exist yet
* 4 Gandalf 1.3 6/7/99 Ian Formanek Allows to select beans
* and category
* 3 Gandalf 1.2 6/4/99 Ian Formanek First cut of
* autoLoadBeans
* 2 Gandalf 1.1 5/17/99 Petr Hamernik very simple version of
* Beans installer
* 1 Gandalf 1.0 5/17/99 Petr Hamernik
* $
*/